# -*- coding: utf-8 -*-
import tracebackfrom mod_log import loggerimport jsonimport mathimport osimport randomimport reimport timeimport yamlfrom legendaryPowerScript._lpcommon.boundingboxes import SphereBoundingBox, CuboidBoundingBoxfrom legendaryPowerScript._lpcommon.vector import Vectorfrom legendaryPowerScript._lpcommon import apiUtil, boundingboxes, vectorfrom legendaryPowerScript.mob.dummyEntities import DummyEntityfrom legendaryPowerScript.spell.graphic import graphicsfrom legendaryPowerScript.spell._spells.amplifier import *from mod.server import extraServerApiclass SubSpell:
    """
    子魔法类，用于表示作为其他魔法一部分的子魔法实例。
    """

    def __init__(self, parentSpell, line):
        """
        初始化 SubSpell 类的新实例。

        Args:
            parentSpell (Spell): 子魔法所归属的父魔法实例。
            line (str or dict): 子魔法的配置信息，可以是字符串（表示命令或魔法名称）或字典（包含详细配置）。

        Attributes:
            parentSpell (Spell): 子魔法的父魔法实例。
            _spell (Spell): 实际的魔法实例，如果子魔法是通过配置字符串解析得到的。
            parameters (dict): 子魔法的参数字典，存储了从配置中解析出的参数。
            powerModifier (float): 子魔法的威力修正值，默认为 1.0。
            command (str): 如果子魔法是一个命令行命令，此属性将存储该命令字符串。
            spellName (str): 子魔法的名称，从配置字符串或字典中解析得到。
        """
        self.parentSpell = Spell()  # type: Spell
        self._spell = Spell()  # type: Spell
        self.parameters = {}  # type: dict
        self.powerModifier = 0.0  # type: float
        self.command = ""  # type: str
        self.spellName = ""  # type: str
        pass

    def getSpell(self):
        # type: () -> Spell
        """
        获取实际的魔法实例。

        Returns:
            Spell: 对应的魔法实例，如果是一个命令则返回自身。
        """
        pass

    def canCast(self, caster, target, param):
        # type: (Creature, Creature, dict) -> bool
        """
        判断子魔法是否可以被施放。

        Args:
            caster (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果子魔法可以被施放则返回True，否则返回False。
        """
        pass

    def canTarget(self, caster, target):
        # type: (Creature, Creature) -> bool
        """
        判断子魔法是否可以以指定目标施放。

        Args:
            caster (Creature): 施放者。
            target (Creature): 目标。

        Returns:
            bool: 如果子魔法可以以指定目标施放则返回True，否则返回False。
        """
        pass

    def cast(self, creature, target, param=None):
        # type: (Creature, Creature or Vector, dict, optional) -> bool
        """
        施放子魔法。

        Args:
            creature (Creature): 施放者。
            target (Creature or Vector): 目标实体或位置。
            param (dict, optional): 施放参数，可以包含额外的信息或设置。

        Returns:
            bool: 如果子魔法成功施放则返回True，否则返回False。
        """
        pass

class Spell:
    """
    魔法类，表示游戏中的魔法效果，可以被施放并具有多种属性和行为。
    """

    def __init__(self, name, data):
        # type: (str, dict) -> Spell
        """
        初始化 Spell 类的新实例。

        Args:
            name (str): 魔法的唯一名称。
            data (dict): 包含魔法属性和配置的字典。

        Attributes:
            versionId (int): 魔法的版本ID，用于区分不同的实例。
            expired (bool): 表示魔法实例是否已过期。
            levelAffectProperty (dict): 等级影响属性的映射。
            name (str): 魔法名称。
            displayName (str): 魔法的显示名称。
            targetAmount (int): 可以影响的目标数量。
            alwaysGranted (bool): 是否始终授予此魔法。
            lockY (bool): 是否锁定Y轴。
            targeter (str): 目标选择器，决定魔法可以对哪些目标生效。
            delay (float): 魔法施放前的延迟时间。
            cooldown (float): 魔法的冷却时间。
            charge (float): 魔法的充能时间。
            mana (float): 施放此魔法所需的魔力值。
            range (float): 魔法的有效距离。
            targetSelf (bool): 是否可以对自己施放。
            chance (float): 施放魔法的几率。
            powerPerLevel (float): 每级提升的威力。
            dummyamount (float): 魔法效果的数值。
            manaPerLevel (float): 每级提升的魔耗。
            pureClientSfxs (bool): 是否只播放纯客户端特效。
            targetBlockCenter (bool): 是否指向方块的中心。
            ignoreInvincible (bool): 是否忽略无敌状态的目标。
            spellType (str): 魔法类型。
            checkLos (bool): 是否检查视线。
            swapCasterTarget (bool): 是否对调施放者和目标。
            warnRadius (float): 警告半径。
            checkDead (bool): 是否检查目标是否死亡。
            itemCosts (dict): 施放魔法所需的物品消耗。
            parameters (dict): 魔法参数。
            owner (Creature): 魔法所有者，可能是创建它的玩家或生物。
            chooseTargetModifier (ModifierSet): 选择目标的修饰符集。
            castModifier (ModifierSet): 施放魔法的修饰符集。
            targetModifier (ModifierSet): 目标修饰符集。
            amplfiers (list): 增幅器列表。
            targetAmplfiers (list): 目标增幅器列表。
            spellsOnStopChannel (list): 引导结束时释放的魔法列表。
            spellsOnCompleteChannel (list): 引导完成时释放的魔法列表。
            cancelCastIfNotCompleteChannel (bool): 是否在引导未完成时不进入冷却。
            spellsOnHit (list): 击中时释放的魔法列表。
            spellsOnEnd (list): 结束时释放的魔法列表。
            spellsOnUpdate (list): 更新时释放的魔法列表。
            compiledGraphics (dict): 编译后的特效字典。
            compiledGraphics2Play (dict): 需要播放的编译后特效字典。
            needCompile (bool): 是否需要编译特效。
            positions (set): 特效位置的集合。
            ... (其他属性): 根据实际代码，可能还有更多的属性。
        """
        pass

    def getAttribute(self, creature, name, level):
        # type: (str) -> any
        """
        根据中文配置键获取魔法属性值。

        Args:
            key (str): 要获取的属性的键。

        Returns:
            any: 对应属性的值。
        """
        pass

    def compileGraphicClient(self, caster, target, delay, rot):
        # type: (Creature or Vector, Creature or Vector, float, tuple) -> None
        """
        编译客户端的特效数据。

        Args:
            caster (Creature or Vector): 施放者或施放位置。
            target (Creature or Vector): 目标或目标位置。
            delay (float): 延迟时间。
            rot (tuple): 旋转角度。
        """
        pass

    def playGraphicClient(self, caster, target, position, delay=0, rot=None):
        # type: (Creature or Vector, Creature or Vector, str, float, tuple) -> None
        """
        在客户端播放特效。

        Args:
            caster (Creature or Vector): 施放者或施放位置。
            target (Creature or Vector): 目标或目标位置。
            position (str): 特效播放的位置类型。
            delay (float): 延迟时间。
            rot (tuple): 旋转角度。
        """
        pass

    def playGraphic(self, position, caster, target, param=None, spellTarget=None):
        # type: (str, Creature, Creature, dict, optional, Creature or Vector, optional) -> None
        """
        播放特效。

        Args:
            position (str): 特效播放的位置类型。
            caster (Creature): 施放者。
            target (Creature): 目标。
            param (dict, optional): 施放参数。
            spellTarget (Creature or Vector, optional): 魔法的目标或位置。
        """
        pass

    def _makeGraphicData(self, caster, target, storedKey, position, delay=0, rot=None):
        # type: (Creature or Vector, Creature or Vector, int, str, float, tuple) -> dict
        """
        生成播放特效所需的数据。

        Args:
            caster (Creature or Vector): 施放者或施放位置。
            target (Creature or Vector): 目标或目标位置。
            storedKey (int): 存储的键值，用于缓存。
            position (str): 特效播放的位置类型。
            delay (float): 延迟时间。
            rot (tuple): 旋转角度。

        Returns:
            dict: 包含特效数据的字典。
        """
        pass

    def getChance(self, creature, target):
        # type: (Creature, Creature) -> float
        """
        获取成功施放魔法的几率。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。

        Returns:
            float: 施放几率。
        """
        pass

    def canCast(self, creature, target, param):
        # type: (Creature, Creature, dict or None) -> bool
        """
        判断是否能够施放魔法。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict or None): 施放参数。

        Returns:
            bool: 如果可以施放则返回True，否则返回False。
        """
        pass

    def cast(self, creature, target, param=None):
        # type: (Creature, Creature, dict) -> bool
        """
        施放魔法。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法成功施放则返回True，否则返回False。
        """
        pass

    def preChannel(self, creature, target, param):
        # type: (Creature, Creature, dict) -> None
        """
        施放前的准备，例如播放特效或警告。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。
        """
        pass

    def castSuccess(self, creature, param=None):
        # type: (Creature, dict, optional) -> None
        """
        施放成功后的处理，例如更新冷却时间或消耗资源。

        Args:
            creature (Creature): 施放者。
            param (dict, optional): 施放参数。
        """
        pass

    def initParam(cls, param=None):
        # type: (dict, optional) -> dict
        """
        初始化施放参数。

        Args:
            param (dict, optional): 已有的参数字典。

        Returns:
            dict: 初始化后的参数字典。
        """
        pass

    def initCastParam(self, param=None, makeNew=True):
        # type: (dict, optional, bool) -> dict
        """
        初始化施放参数，用于施放过程中。

        Args:
            param (dict, optional): 已有的参数字典。
            makeNew (bool): 是否创建参数的新副本。

        Returns:
            dict: 初始化后的施放参数字典。
        """
        pass

    def findTarget(self, creature, param):
        # type: (Creature, dict) -> Creature or Vector or None
        """
        根据施放者和参数寻找目标。

        Args:
            creature (Creature): 施放者。
            param (dict): 施放参数。

        Returns:
            Creature or Vector or None: 找到的目标或位置，如果未找到则返回None。
        """
        pass

    def canTarget(self, creature, target):
        # type: (Creature, Creature) -> bool
        """
        判断目标是否可以被此魔法施放。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。

        Returns:
            bool: 如果目标可以被施放则返回True，否则返回False。
        """
        pass

    def castRealDelayed(self, creature, target, param):
        # type: (Creature, Creature, dict) -> bool
        """
        延迟施放魔法的实际效果。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法可以被施放则返回True，否则返回False。
        """
        pass

    def castReal(self, creature, target, param):
        # type: (Creature, Creature, dict) -> bool
        """
        施放魔法的实际效果。在各个具体的魔法类中实现

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法成功施放则返回True，否则返回False。
        """
        pass

    def clone(self, creature=None):
        # type: () -> Spell
        """
        克隆当前魔法实例。

        Args:
            creature (Creature, optional): 如果克隆用于特定生物，可以提供生物实例。

        Returns:
            Spell: 克隆的魔法实例。
        """
        pass

class TargetEntitySpell(Spell):
    """
    针对实体的目标魔法类，表示需要选择一个实体作为目标的魔法。
    """

class TargetLocationSpell(TargetEntitySpell):
    """
    针对位置的目标魔法类，表示需要选择一个位置作为目标的魔法。
    """

class AOESpell(TargetLocationSpell):
    """
    区域效果魔法类，表示影响特定区域内所有目标的魔法。
    """

    def __init__(self, name, data):
        # type: (str, dict) -> None
        """
        初始化 AOESpell 类的新实例。

        Args:
            name (str): 魔法的唯一名称。
            data (dict): 包含魔法属性和配置的字典，包括半径、高度、扇面角度等。

        Attributes:
            radius (float): 影响区域的半径。
            height (float): 影响区域的高度。
            cuboidBB (bool): 是否使用方形区域效果。
            minRadius (float): 影响区域的最小半径。
            sectorAngle (float): 扇面角度。
            angleOffset (float): 扇面偏移角度。
            launchOffset (Vector): 发射位置偏移。
            castFromCenter (bool): 是否从技能中心位置施放子魔法。
            workCount (int): 魔法生效的次数。
            chooseRandomPosition (bool): 是否选择随机位置施放。
            ... (其他属性): 根据实际代码，可能还有更多的属性。
        """
        pass

    def canCast(self, creature, target, param):  # type: (Creature, Creature, dict or None) -> bool
        # type: (Creature, Creature, dict or None) -> bool
        """
        判断生物是否可以在区域内施放该魔法。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict or None): 施放参数。

        Returns:
            bool: 如果可以施放则返回True，否则返回False。
        """
        pass

    def castReal(self, creature, target, param):
        # type: (Creature, Creature, dict) -> bool
        """
        执行魔法的实际施放逻辑，影响区域内的所有目标。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法成功施放则返回True，否则返回False。
        """
        pass

    def getHitted(self, creature, target=None, param=None, angleOffset=None):
        # type: (Creature, Creature, dict) -> None
        """
        重写实际施放逻辑，处理区域内所有目标。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。
        """
        pass

    def _doAoe(self, creature, target=None, param=None, angleOffset=None):
        # type: (Creature, Creature, optional, dict, optional, float, optional) -> list
        """
        确定并返回在区域效果魔法范围内被击中的目标列表。

        Args:
            creature (Creature): 施放者。
            target (Creature, optional): 目标。如果未指定，则使用施放者的当前目标。
            param (dict, optional): 施放时的参数字典，可能包含额外的施放信息。
            angleOffset (float, optional): 角度偏移量，用于调整魔法效果的扇面。

        Returns:
            list: 在魔法效果范围内被击中的目标列表。
        """
        pass

class OBBSpell(TargetLocationSpell):
    """
    定向包围盒魔法类，表示影响由定向包围盒定义区域内的目标的魔法。
    """

    def __init__(self, name, data):
        # type: (str, dict) -> None
        """
        初始化 OBBSpell 类的新实例，用于创建定向包围盒(Oriented Bounding Box)影响的魔法。

        Args:
            name (str): 魔法的唯一名称。
            data (dict): 包含魔法属性和配置的字典。

        Attributes:
            length (float): OBB的长度。
            width (float): OBB的宽度。
            height (float): OBB的高度。
            angleOffset (float): OBB的偏移角度。
            launchOffset (Vector): 发射位置的偏移量。
            workCount (int): 魔法生效的次数。
            adaptToBB (bool): 是否根据生物的碰撞箱自适应OBB大小。
            sortBy (str): 优先级排序的条件。
            sortByReversed (bool): 是否反向优先级排序。
            castAtRandomTarget (bool): 是否随机目标施放。
            castAtCenterIfNoTarget (bool): 如果无目标是否在中心施放。
            ignoreTarget (bool): 是否忽略魔法目标不受影响。
            castFromCenter (bool): 是否从中心点施放子魔法。
            ... (其他属性): 其他相关属性。
        """
        pass

    def canCast(self, creature, target, param):  # type: (Creature, Creature, dict or None) -> bool
        # type: (Creature, Creature, dict or None) -> None
        """
        重写可以施放的判断逻辑，包括定向包围盒内是否有目标等。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict or None): 施放参数。
        """
        pass

    def preChannel(self, creature, target, param):
        # type: (Creature, Creature, dict) -> None
        """
        在施放定向包围盒(OBB)魔法前的准备动作，例如播放警告粒子效果。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数，可能包含延迟时间等信息。
        """
        pass

    def buildOBB(self, creature, target, param):
        # type: (Creature, Creature, dict) -> tuple
        """
        构建定向包围盒(OBB)。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            tuple: 包含构建的OBB和相关位置的元组。
        """
        pass

    def castReal(self, creature, target, param):
        # type: (Creature, Creature, dict) -> None
        """
        重写实际施放逻辑，处理定向包围盒内的目标。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。
        """
        pass

class RaySpell(OBBSpell):
    """
    射线魔法类，表示沿直线发射并可能扩展为一定半径影响范围的魔法。
    """

    def __init__(self, name, data):
        # type: (str, dict) -> None
        """
        初始化 RaySpell 类的新实例。

        Args:
            name (str): 魔法的唯一名称。
            data (dict): 包含魔法属性和配置的字典。

        Attributes:
            towardX (bool): 是否沿X轴扩展射线宽度。
            towardY (bool): 是否沿Y轴扩展射线高度。
            checkLos (bool): 是否检查视线阻挡。
            radius (float): 射线末端的半径大小，用于形成圆形影响区域。
            warnRadius (float): 警告半径，用于显示射线的潜在影响范围。
        """
        pass

    def preChannel(self, creature, target, param):
        # type: (Creature, Creature, dict) -> None
        """
        施放前的准备，包括射线施放的视觉效果和警告。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数，包含施放相关的配置信息。
        """
        pass

    def castReal(self, creature, target, param):  # type: (Creature, Creature, dict) -> bool
        # type: (Creature, Creature, dict) -> bool
        """
        执行射线魔法的实际施放逻辑。

        Args:
            creature (Creature): 施放者。
            target (Creature): 目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法成功施放则返回True，否则返回False。
        """
        pass

class PassiveSpell(Spell):
    """
    被动魔法类，表示自动触发的魔法效果，无需玩家主动施放。
    """

    def __init__(self, name, data):
        # type: (str, dict) -> None
        """
        初始化 PassiveSpell 类的新实例。

        Args:
            name (str): 被动魔法的唯一名称。
            data (dict): 包含被动魔法属性和配置的字典。

        Attributes:
            event (str): 触发被动魔法的事件名称。
            eventTriggerPre (function): 事件触发前的回调函数，用于在触发前进行额外的检查或设置。
            eventTriggerPost (function): 事件触发后的回调函数，用于在触发后进行额外的处理。
            powerIsEventAmount (bool): 表示被动魔法的威力是否由事件数据决定。
            changeEventAmount (bool): 表示被动魔法是否改变事件数据。
            addCritChance (float): 被动魔法提供的额外暴击率。
            cancelEvent (bool): 表示是否在被动魔法触发后取消原始事件。
            requireSpellName (str or None): 需要特定魔法名称以触发此被动魔法。
            requireSpellType (str or None): 需要特定魔法类型以触发此被动魔法。
        """
        pass

    def trigger(self, caster, target, data):
        # type: (Creature, Creature, dict) -> None
        """
        触发被动魔法的效果。

        Args:
            caster (Creature): 施放者或触发者。
            target (Creature): 被影响的目标。
            data (dict): 事件相关的数据，可能包含额外的上下文信息。

        Returns:
            None
        """
        pass

    def castReal(self, creature, target, param):  # type: (Creature, Creature, dict) -> bool
        # type: (Creature, Creature, dict) -> bool
        """
        执行被动魔法的实际效果。

        Args:
            creature (Creature): 施放者或触发者。
            target (Creature): 被影响的目标。
            param (dict): 施放参数。

        Returns:
            bool: 如果魔法成功触发则返回True，否则返回False。
        """
        pass

class SpellManager:
    """
    魔法管理器类，负责管理所有的魔法，包括加载、重载、获取魔法实例等。
    """

    def __init__(self):
        """
        初始化 SpellManager 类的新实例，设置存储魔法的字典和魔法类型映射。

        '尺寸': ScaleSpell,
        '伤害': PainSpell,
        '脚本': ScriptSpell,
        '护盾': ShieldSpell,
        '魔力': ManaSpell,
        '回蓝': ManaSpell,
        '恢复': HealSpell,
        '回复': HealSpell,
        '冲刺': LeapSpell,
        '传送': TeleportSpell,
        '击退': KnockbackSpell,
        '范围': AOESpell,
        'AOE': AOESpell,
        'OBB': OBBSpell,
        '方形': OBBSpell,
        '射线': RaySpell,
        '方形范围': OBBSpell,
        '组合': MultiSpell,
        '冷却': CooldownSpell,
        '被动': PassiveSpell,
        '指令': CommandSpell,
        '脉冲': PulserSpell,
        '获得魔法': GrantBuffSpell,
        '突变': MutateSpell,
        '组合技': ComboSpell,
        '脉冲BUFF': PulseBuffSpell,
        '变身BUFF': MorphBuffSpell,
        '沉默BUFF': SilenceSpell,
        '药水BUFF': PotionBuffSpell,
        '属性BUFF': AttributeBuffSpell,
        '词条BUFF': BattleActionBuffSpell,
        '词条被动': PassiveTagSpell,
        '生成经验': DropExpSpell,
        '闪现': BlinkSpell,
        '掉落物品': DropItemSpell,
        '弹道': BulletSpell,
        '力场BUFF': ForcefieldBuffSpell,
        "减伤": InvuluableBuffSpell,
        "减伤BUFF": InvuluableBuffSpell,
        "事件": CustomEventSpell,
        "召唤": SummonSpell,
        "净化": CleanseSpell,
        "嘲讽": TauntSpell,
        "仇恨": TauntSpell,
        "延长BUFF": ExtendBuffTimeSpell,
        "飞弹": ProjectileSpell,
        "结构": SchematicSpell,
        "充能": ChargeSpell,
        "DOT": DOTBuffSpell,
        "DOTBUFF": DOTBuffSpell,
        "持续伤害BUFF": DOTBuffSpell,
        "穿过BUFF": PassThroughBuffSpell,
        "克隆": CloneSpell,
        "爆炸": ExplodeSpell
        """
        pass

    def factory(self, name, data, register=True, cloned=False, creature=None):
        # type: (str, dict, bool, bool) -> Spell
        """
        创建魔法实例。

        Args:
            name (str): 魔法名称。
            data (dict): 魔法配置数据。
            register (bool): 是否将创建的魔法注册到管理器中。
            cloned (bool): 是否是克隆的魔法实例。
            creature (Creature, optional): 魔法所有者，如果魔法属于某个生物。

        Returns:
            Spell: 创建的魔法实例。
        """
        pass

    def getSpell(self, name):
        # type: (str) -> Spell
        """
        根据名称获取魔法实例。

        Args:
            name (str): 魔法名称。

        Returns:
            Spell or None: 如果找到魔法则返回实例，否则返回None。
        """
        pass

    def ReloadPartial(self, reloader):
        # type: (object) -> None
        """
        部分重载魔法，当检测到魔法文件改变时触发。

        Args:
            reloader (object): 用于发送重载状态的回调对象。
        """
        pass

    def Reload(self):
        # type: () -> None
        """
        完全重载所有魔法，用于刷新魔法配置。
        """
        pass

    def _onLoadSpell(self, path, fileName, dict):
        # type: (str, str, dict) -> None
        """
        在加载魔法文件时调用，用于创建和注册新的魔法。

        Args:
            path (str): 文件路径。
            fileName (str): 文件名。
            dict (dict): 文件中的魔法配置数据。
        """
        pass

